package com;

import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;

import java.lang.reflect.Method;
import java.sql.Connection;
import java.util.Properties;

/**
 * 自定义插件
 *
 * @Intercepts：开启拦截
 * @Signature：指定拦截信息
 *    type：拦截的哪个对象  四大对象
 *    method：拦截这个对象的哪个方法
 *    args：需要mybatis传什么参数给你
 */
@Intercepts(@Signature(type = StatementHandler.class,method = "prepare",args = {Connection.class,Integer.class}))
public class MyInterceptorPlugin implements Interceptor {

  /**
   * 我们自己拦截器执行的逻辑
   * @param invocation：可以获取拦截对象、拦截方法、传递的参数
   * @return
   * @throws Throwable
   */
  @Override
  public Object intercept(Invocation invocation) throws Throwable {
    //todo: 编写缓存逻辑
    //拦截的目标对象
    StatementHandler target = (StatementHandler)invocation.getTarget();
    //拦截的目标方法
    Method method = invocation.getMethod();
    //传递的参数
    Object[] args = invocation.getArgs();
    return null;
  }

  /**
   * 需要你自己返回一个代理后的对象
   * @param target： 代理的原对象
   * @return
   */
  @Override
  public Object plugin(Object target) {
    return Plugin.wrap(target,this);
  }

  /**
   * 可以传入配置文件的内容  用户可以根据配置文件的内容自定义配置
   * @param properties
   */
  @Override
  public void setProperties(Properties properties) {

  }
}
